package com.sprouting.personal.model.common;

import com.sprouting.personal.emums.ResultEnum;
import com.sprouting.personal.interfaces.common.ConstantMsg;
import lombok.Data;

import java.io.Serializable;

/**
 * @author ：LX
 * @ Date 创建时间： 2021/5/17. 18:07
 * 地点：长沙麓谷
 * 目的: 统一返回对象包装类
 * 备注说明：
 */
@Data
public class ResultJson<T> implements Serializable {

    /**
     * 代码
     * 根据该代码判断要做的事情，比如401跳转登录之类的
     * @see ResultEnum#getCode()
     */
    private Integer code;
    /**
     * 状态 前端通过判断该值来确认请求成功还是失败
     * @see ResultEnum#getStatus()
     */
    private String status;
    /**
     * 返回给前端的消息 常用消息
     * @see ConstantMsg
     */
    private String msg;
    /**
     * 返回的数据
     */
    private T data;


    public ResultJson(Integer code, String status, String msg, T data) {
        this.code = code;
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 错误时候的构造
     * @param msg 错误信息
     */
    public ResultJson(String msg){
        this.status = ResultEnum.ERROR.getStatus();
        this.code = ResultEnum.ERROR.getCode();
        this.msg = msg;
    }

    /**
     * 成功时候的构造
     * @param msg 成功信息
     * @param data 要返回的数据
     */
    public ResultJson(String msg, T data){
        this.status = ResultEnum.SUCCESS.getStatus();
        this.code = ResultEnum.SUCCESS.getCode();
        this.msg = msg;
        this.data = data;
    }

    /**
     * 序列化用的构造函数
     */
    public ResultJson() {
    }

    /**
     * 返回错误信息，不会提示泛型问题
     * @param msg 错误信息
     * @return
     */
    public static <T> ResultJson<T> error(String msg){
        return new ResultJson<>(msg);
    }

    /**
     * 非法错误调用-少参数，无效的请求等
     * @return
     */
    public static <T> ResultJson<T> errorIllegal(){
        return new ResultJson<>(ConstantMsg.ERROR_MSG_ILLEGAL_REQUEST);
    }

    /**
     * 无效请求错误-参数对应不上，查询不到东西
     * @return
     */
    public static <T> ResultJson<T> errorPram(){
        return new ResultJson<>(ConstantMsg.ERROR_MSG_INVALID_PARM_REQUEST);
    }

    /**
     * 成功返回，不会提示泛型问题
     * @param msg 返回信息
     * @param data 返回的数据
     * @param <T> 数据类型
     * @return
     */
    public static <T> ResultJson<T> success(String msg, T data){
        return new ResultJson<T>(msg, data);
    }

    /**
     * 成功返回，不会提示泛型问题
     * @param data 返回的数据
     * @param <T> 数据类型
     * @return
     */
    public static <T> ResultJson<T> success(T data){
        return new ResultJson<T>(ConstantMsg.SUCCESS_MSG, data);
    }

    /**
     * 成功返回
     * @param <T> 数据类型
     * @return
     */
    public static <T> ResultJson<T> success(){
        return new ResultJson<T>(ConstantMsg.SUCCESS_MSG, null);
    }

}
